<template>
  <div>
    <!-- 插值语法简洁化：将过长的数据引用，写在计算属性中。 -->
    <h1>当前求和为：{{sum}}</h1>
    <h3>当前求和放大十倍为：{{bigSum}}</h3>
    <h3>我在{{school}}，学习{{subject}}</h3>
    <!-- v-model.number：将表单收集到的数据强制转换为number类型，然后再赋值。 -->
    <select v-model.number="number">
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
    </select>
    <button @click="increment">+</button>
    <button @click="decrement">-</button>
    <button @click="incrementOdd">当前求和为奇数再加</button>
    <button @click="incrementWait">等一等再加</button>
  </div>
</template>

<script>
    // 引入mapState、mapGetters
    import {mapState, mapGetters} from 'vuex'

    export default {
        name:"Count",
        data() {
            return {
                number:1, // 用户选择的数字
            }
        },
        computed:{
            // 将从store中拿到的数据亲自写在在计算属性中（没有使用mapState的情况，程序员自己亲自写的数据获取的方式）
            // sum(){ // 直接通过this.$store来获取state中存储的共享数据
            //     return this.$store.state.sum;
            // },

            // school(){ // 学校名称
            //     return this.$store.state.school;
            // },

            // subject(){ // 课程名称
            //     return this.$store.state.subject;
            // },

            // 借助mapState生成计算属性，从state中读取数据。（对象写法：引入mapState后在方法内传入对象）
            // key：当前组件中插值语法写的属性名称；value：state中的数据名
            // ...mapState({sum:'sum' ,school:'school' ,subject:'subject'}), 

            /* mapState前加'...'的意义：mapState最终输出得到的是一个对象{}，计算属性本身也是对象，对象中写对象前面加上'...'属于解构赋值 */

            // 借助mapState生成计算属性，从state中读取数据。（数组写法：一个参数，两种用途）
            ...mapState(['sum' ,'school' ,'subject']),  // 这样写能正常拿到state中的数据，最终也会生成一个同名的计算属性
            
            /***************************************************************************************************************/
            // 自写在在计算属性中的写法
            // bigSum(){ // 直接通过$store来获取getters中对state加工的共享数据
            //     return this.$store.getters.bigSum;
            // },

            // 借助mapGetters生成计算属性
            // ...mapGetters({bigSum:'bigSum'}), // 对象写法

            ...mapGetters(['bigSum']), // 数组写法

        },
        methods:{
            // 如果被调用的事件'逻辑简单' 或 '没有后端交互' 可以不用在组件这块调用dispatch()走actions这一步。
            increment(){
                // 过于简单的逻辑，直接调commit()方法走mutations执行数据操作（直接跳过actions将业务写在mutations）
                this.$store.commit('INCREMENT' ,this.number);
            },

            decrement(){
                // 过于简单的逻辑，直接调commit()方法走mutations执行数据操作（直接跳过actions将业务写在mutations）
                this.$store.commit('DECREMENT' ,this.number);
            },

            incrementOdd(){
                // dispatch()：通知actions执行操作。（参数1为执行操作的名称（自定义），参数2为需要传递的数据）
                this.$store.dispatch('incrementOdd' ,this.number);
            },

            incrementWait(){
                this.$store.dispatch('incrementWait' ,this.number);
            }
        },
        mounted() {
            // const x = mapState({sum:'sum',school:'school',subject:'subject'})
            console.log(x);
        }
    }
</script>

<style>
    button {
        margin-left: 5px;
    }
</style>